<?php

  /**
   * CommentRecord
   *
   * ORM для таблиц, для записей которых можно оставлять комменты
   *
   * @property      int         $id             идентификатор записи
   * @property      int         $is_sentenced   признак удаления
   * @property-read Authority[] $authority      оценки
   * @property-read Comment[]   $commentaries   комментарии
   * @property-read int         $authorityLevel уровень авторитетности
   * @property-read int         $complaint      количество жалоб
   * @method CommentRecord acting()    выборка действующих записей
   * @method CommentRecord sentenced() выборка удаленных записей
   */

  abstract class CommentRecord extends UserRecord
  {
    /**
     * правила проверки атрибутов модели
     *
     * @return array[]
     * @access public
     */
    public function rules()
    {
      return array(array("is_sentenced", "safe")) + parent::rules();
    }

    /**
     * наборы фильтров для выборки
     *
     * @return array[]
     * @access public
     */
    public function scopes()
    {
      static $acting = "`t`.`is_sentenced` is null or `t`.`is_sentenced`='0'";

      return array(
        "acting"    => array("condition" => $acting),
        "sentenced" => array("condition" => "not ($acting)")
      ) + parent::scopes();
    }

    /**
     * связи с другими таблицами
     *
     * @return array[]
     * @access public
     */
    public function relations()
    {
      $table = $this->tableName();

      return array(
        "authority"    => array(self::HAS_MANY, "Authority", "rec_id", "on" => "`table`='$table'"),
        "commentaries" => array(self::HAS_MANY, "Comment"  , "rec_id", "on" => "`table`='$table'")
      ) + parent::relations();
    }

    /**
     * действия перед удалением
     *
     * @return bool
     * @access protected
     */
    protected function beforeDelete()
    {
      if ($success = parent::beforeDelete())
      {
        Authority::model()->deleteAllByAttributes(array("table" => $this->tableName(), "rec_id" => $this->id));

        foreach ($this->commentaries as $comment)
          $comment->delete();
      }

      return $success;
    }

    /**
     * Удалить "приговоренных"
     *
     * @return void
     */
    public function sentence()
    {
      foreach ($this->sentenced()->findAll() as $record)
        $record->delete();

      return $this;
    }

    /**
     * Инвертировать "приговор"
     *
     * @return bool
     */
    public function sentencedInvert()
    {
      $this->saveAttributes(array("is_sentenced" => $this->is_sentenced ? null : 1));
      return $this->is_sentenced === null;
    }

    /**
     * подсчитать уровень авторитетности для поста
     *
     * @return int
     * @access public
     */
    public function getAuthorityLevel()
    {
      $a = 0;

      foreach ($this->authority as $authority)
        switch (mb_strtolower($authority->score))
        {
          case Authority::PLUS : ++$a; break;
          case Authority::MINUS: --$a; break;
        }

      return $a;
    }

    /**
     * вернуть кол-во жалоб
     *
     * @return int
     * @access public
     */
    public function getComplaint()
    {
      return Authority::model()->count("`table`='".$this->tableName()."' and `rec_id`='$this->id' and `score`='complaint'");
    }

    /**
     * вернуть кол-во комментов
     *
     * @param bool $own только собственные комментарии
     * @return int
     * @access public
     */
    public function getCommentsTotal($own = false)
    {
      $comments = $this->commentaries;
      $total    = count($comments);

      if (!$own)
        foreach ($comments as $comment)
          $total += $comment->getCommentsTotal();

      return $total;
    }
  }

?>
